package com.skyd.core.android.game;

/**
 * 数值步进变化动作基类，不支持循环和持续时间设置
 * 
 * @author SkyD
 * 
 */
public abstract class GameNumberStepMotion<T extends Number> extends GameMotion {

	/**
	 * 构造函数
	 * 
	 * @param targetValue
	 *            目标值
	 * @param stepLength
	 *            步进长度
	 * @param tolerance
	 *            容差
	 */
	public GameNumberStepMotion(T targetValue, T stepLength, T tolerance) {
		super();
		setTargetValue(targetValue);
		setStepLength(stepLength);
		setTolerance(tolerance);
	}

	@Override
	protected boolean getIsComplete(GameObject obj) {
		return Math.abs(getTargetValue().doubleValue()-getCurrentValue(obj).doubleValue())<=getTolerance().doubleValue();
	}

	/**
	 * 获取当前的值
	 * 
	 * @param obj
	 *            目标对象
	 * @return 当前的值
	 */
	protected abstract T getCurrentValue(GameObject obj);

	protected abstract void setCurrentValue(GameObject obj, T value);

	@Override
	protected void restart(GameObject obj) {

	}

	@Override
	protected void updateSelf(GameObject obj) {

	}

	@Override
	protected void updateTarget(GameObject obj) {
		T c = getCurrentValue(obj);
		T o = plus(c, getStepLength());
//		boolean b = o.doubleValue() > getTargetValue().doubleValue();
//		if (getStepLength().doubleValue() < 0)
//			b = !b;
//		if (b)
//			setCurrentValue(obj, getTargetValue());
//		else
			setCurrentValue(obj, o);
	}


	/**
	 * 加运算
	 * 
	 * @param v1
	 *            值1
	 * @param v2
	 *            值2
	 * @return 运算结果
	 */
	protected abstract T plus(T v1, T v2);

	/**
	 * 功能注释：目标值
	 */
	private T _TargetValue;

	/**
	 * 获取TargetValue。 功能注释：目标值
	 * 
	 * @return 当前的T类型的值
	 */
	public T getTargetValue() {
		return _TargetValue;
	}

	/**
	 * 设置TargetValue。 功能注释：目标值
	 * 
	 * @param value
	 *            要设置的T类型值
	 */
	public void setTargetValue(T value) {
		_TargetValue = value;
	}

	/**
	 * 
	 * 功能注释：步进值
	 */
	private T _StepLength;

	/**
	 * 获取StepLength。 功能注释：步进值
	 * 
	 * @return 当前的T类型的值
	 */
	public T getStepLength() {
		return _StepLength;
	}

	/**
	 * 设置StepLength。 功能注释：步进值
	 * 
	 * @param value
	 *            要设置的T类型值
	 */
	public void setStepLength(T value) {
		_StepLength = value;
	}

	/**
	 * 初始值为null。 功能注释：容差
	 */
	private T _Tolerance;

	/**
	 * 获取Tolerance。 功能注释：容差
	 * 
	 * @return 当前的T类型的值
	 */
	public T getTolerance() {
		return _Tolerance;
	}

	/**
	 * 设置Tolerance。 功能注释：容差
	 * 
	 * @param value
	 *            要设置的T类型值
	 */
	public void setTolerance(T value) {
		_Tolerance = value;
	}

}
